<?

/*
  Класс для маршрутизации вызовов контроллера.
  Формат вызова контроллера. Имя контроллера/метод контроллера/параметр/параметр/...
  Параметры попадают в контроллер в виде массива(нумерация с 0).

  Создан: 2011-03-09
  Автор: djerom, tonatos
  Версия: 0.0.0.3
 */

class c_router_util {

    /**
     * Жестко заданная строка пути, тоесть если тут задано
     * controller/metod то будет только этот метод и выполнятся
     * если controller, то нельзя будет вызвать другой контроллер
     * необходимо для ограничения области исполнения.
     *
     * @param string $default
     */
    function __construct($default="") {
        if ($default){
            $this->default = explode('/', $default);
        }
    }

    /**
     * Разбор пути и вызов контроллера
     *
     * @global <type> $mvc
     * @param string $route - путь вызова контроллера обычно $_GET['q'] (назначается в htaccess через RewriteRule).
     * @param array $params - добавочные параметры контроллера $_GET или $_REQUEST.
     * @return string
     */
    function route($route, $params = array()) { // $_GET['q'], $_GET
        global $mvc;

        $parts = explode('/', $route); // Дробим вызов на параметры.

        //Переписываем контроллер и другие параметы
        if (!empty($this->default)){
            $parts = $this->default + $parts; //http://www.php.net/manual/en/function.array-merge.php
        }

        //Формируем имя контроллера
		$controller_base_name = (empty($parts[0]) ? $mvc->config['default_controller'] : $parts[0] );
		$parts[0] = $controller_base_name; // Эмулируем выбор контроллера.
		// Контроллеры с префиксом _ приватные и не видны снаружи.
		if (substr($controller_base_name, 0, 1) != '_')
	        $controller_name = 'c_' . $controller_base_name . '_controller';
		else
			$controller_name = '';		

        //Если нет контроллера вываливаем 404 страницу и умираем.
        /*
		if (!file_exists($mvc->parse("{base_path}controllers/$controller_name.php"))) {
            $mvc->send_error_page();
        }
		*/
		// Если файл контроллера существует, создаем его.
		if (file_exists($mvc->parse("{base_path}controllers/$controller_name.php"))) {
            $controller = new $controller_name();
        }
		
		//else
		{
			//$mvc->redirect('error/404?prev='.$route);
		}

        // Получаем имя метода.
        $method = (!empty($parts[1])) ? str_replace(".html", "", $parts[1]) : "index";
		$parts[1] = $method;

        // Если нет метода вываливаем 404 страницу. // !edited by djerom
        /*
		if (!method_exists($controller, $method)) {
            $mvc->send_error_page();
        }
		*/
		
		// Если метод не определен, то ставим его в index. А параметры сдвигаем на 1 вправо.
		// Таким образом, обработка page/index/12 и page/12 в контроллере page будет аналогичной.
		// Методы, начинающиеся с _ также являются приватными. Перебросим с них на index. 
		// (!djerom Возможно нужно приватные методы на 404 переводить)
		if ( (substr($method, 0, 1) == '_') || !method_exists($controller, $method)) {
				//print_r($parts);
				//echo '111';
			$method = 'index';
			$contr_name = array_shift($parts);
			array_unshift($parts, $method);
			array_unshift($parts, $contr_name);           
        }

		// Провеярем доступность полученной станицы.
		$allowed = $mvc->user->allowed(implode('/', $parts), $params);
		
		// Для страницы найден редирект.
		if ($allowed[1])
		{
			$mvc->redirect($allowed[1]);
		}
		elseif (($allowed[0] == 0) && ($parts[0] != 'error')) // Разрешения на страницу нет(статус 0 или 2) и это не страница ошибок.
		{
			// Направим на error/401.
			$mvc->redirect('error/401');
		}
		elseif ($controller) // Разрешение есть и контроллер создан.
		{
			//Добавляем дополнительные параметры.
			$params = array_merge($parts, $params);				
			ob_start();
			//Вызываем метод загруженного контроллера.
			$res = $controller->$method($params);
			return ob_get_clean().$res;
        } 
		else {
			// Контроллер не создан. Видимо не такой страницы. Запишем в лог и перекинем на error/404 - страницы не существует.
			$mvc->message('No controllers avaliable.', 2);
			unset($params['q'], $params['PHPSESSID'], $params['_prev_url']);
			$mvc->redirect($mvc->config['base_url'].'error/404?_prev_url='.$route.'&'.http_build_query($params, '', '&'));
        }
    }

    // Портированао из c_router for tonatos.
    function loader() {
        return $this->route($_GET['action']);
    }
}

?>